home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-09-05 | 24.9 KB | 1,020 lines |
- *** /tmp/,RCSt1a22974 Thu Aug 31 20:57:45 1989
- --- Makefile.16 Thu Aug 31 20:56:14 1989
- ***************
- *** 50,56 ****
- execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
-
- GNUSUPPORT = \
- ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o \
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
- _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
- _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
- --- 50,56 ----
- execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
-
- GNUSUPPORT = \
- ! fixnum.o \
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
- _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
- _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
- ***************
- *** 76,82 ****
- rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
- rm -f $(SFILES)
- rm -f $(O14)
- ! rm -f $(O12) ivfprintf.o
-
- libc.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(GNUSTUFF) $(O14) $(O12)
- rm -f $@
- --- 76,82 ----
- rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
- rm -f $(SFILES)
- rm -f $(O14)
- ! rm -f $(O12) ivfprintf.o iscanf.o
-
- libc.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(GNUSTUFF) $(O14) $(O12)
- rm -f $@
- ***************
- *** 135,150 ****
- $(CC) -O -DATARI_ST -c atof.c -DNDEBUG \
- -fomit-frame-pointer -fcombine-regs -fstrength-reduce
-
- ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o : fixnumMade
- ! fixnumMade : fixnum.s
- ! for name in _umulsi3 _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 ; \
- ! do \
- ! echo $${name}; \
- ! $(CPP) -P -DL$${name} -D__GNUC__ -D__MSHORT__ fixnum.s > $${name}.s; \
- ! $(CC) -c $${name}.s; \
- ! rm -f $${name}.s;\
- ! done
- ! touch fixnumMade
-
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
- sflonumMade : sflonum.s
- --- 135,141 ----
- $(CC) -O -DATARI_ST -c atof.c -DNDEBUG \
- -fomit-frame-pointer -fcombine-regs -fstrength-reduce
-
- ! fixnum.o : fixnum.s
-
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
- sflonumMade : sflonum.s
- *** /tmp/,RCSt1a22974 Thu Aug 31 20:57:48 1989
- --- Makefile.32 Thu Aug 31 20:56:14 1989
- ***************
- *** 52,58 ****
- execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
-
- GNUSUPPORT = \
- ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o \
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
- _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
- _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
- --- 52,58 ----
- execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
-
- GNUSUPPORT = \
- ! fixnum.o \
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
- _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
- _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
- ***************
- *** 73,82 ****
- rm -f $(O3)
- rm -f $(O4)
- rm -f $(O5)
- ! rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
- rm -f $(SFILES)
- rm -f $(O14)
- ! rm -f $(O12) ivfprintf.o
-
- libc32.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(GNUSTUFF) $(O14) $(O12)
- rm -f $@
- --- 73,82 ----
- rm -f $(O3)
- rm -f $(O4)
- rm -f $(O5)
- ! rm -f $(GNUSTUFF) sflonumMade dflonumMade
- rm -f $(SFILES)
- rm -f $(O14)
- ! rm -f $(O12) ivfprintf.o iscanf.o
-
- libc32.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(GNUSTUFF) $(O14) $(O12)
- rm -f $@
- ***************
- *** 109,125 ****
- stsndrec.s : stsndrec.cpp
- bcopy.o : bcopy.s
- alloca.o : alloca.s
- !
- ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o : fixnumMade
- ! fixnumMade : fixnum.s
- ! for name in _umulsi3 _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 ; \
- ! do \
- ! echo $${name}; \
- ! $(CPP) -P -DL$${name} -D__GNUC__ fixnum.s > $${name}.s; \
- ! $(CC) -c $${name}.s; \
- ! rm -f $${name}.s;\
- ! done
- ! touch fixnumMade
-
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
- sflonumMade : sflonum.s
- --- 109,115 ----
- stsndrec.s : stsndrec.cpp
- bcopy.o : bcopy.s
- alloca.o : alloca.s
- ! fixnum.o : fixnum.s
-
- _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
- sflonumMade : sflonum.s
- *** /tmp/,RCSt1a22974 Thu Aug 31 20:57:49 1989
- --- PatchLevel.h Thu Aug 31 20:56:15 1989
- ***************
- *** 1,5 ****
- /*
- ! * PathLevel: 13
- *
- * the Patch Level above is to identify the version
- * of the all the files in this directory. given the above
- --- 1,5 ----
- /*
- ! * PathLevel: 14
- *
- * the Patch Level above is to identify the version
- * of the all the files in this directory. given the above
- *** /tmp/,RCSt1a22974 Thu Aug 31 20:58:34 1989
- --- dflonum.c Thu Aug 31 20:56:24 1989
- ***************
- *** 52,60 ****
-
- */
-
- - #include <stdio.h>
- - /* #include <math.h> */
- -
- #include "flonum.h"
-
- #ifdef __GCC_OLD__
- --- 52,57 ----
- ***************
- *** 86,422 ****
- #define dtol __fixdfsi
- #define ltod __floatsidf
- #endif
- -
- - #if 0 /* see eprintf.c in minix library */
- - #ifdef L_eprintf
- - #include <stdio.h>
- - /* This is used by the `assert' macro. */
- - void
- - _eprintf (string, line)
- - char *string;
- - int line;
- - {
- - fprintf (stderr, string, line);
- - }
- - #endif
- - #endif
-
- ! #ifdef L_umulsi3
-
- ! /*_umulsi3 (a, b) unsigned a, b; { return a * b; } */
-
- ! unsigned long umultl(a,b)
- ! unsigned long a, b;
- ! {
- ! register unsigned long d7, d6, d5, d4;
- !
- ! d7 = a;
- ! d6 = b;
- ! d5 = d6;
- ! d4 = d6;
- ! /* without the next line, gcc may core dump. Gcc sometimes
- ! gets confused if you have too many registers */
- !
- ! &a; &b;
- !
- ! /*printf("a %u b %u\n", a, b);*/
- !
- ! /* low word */
- ! MUL(d7, d6);
- ! SWAP(d5);
- ! MUL(d7, d5);
- ! SWAP(d7);
- ! MUL(d7, d4);
- ! d4 += d5;
- ! SWAP(d4);
- ! d4 &= 0xFFFF0000;
- ! d4 += d6;
- ! return(d4);
- ! }
- ! #endif
- !
- ! #ifdef L_mulsi3
- ! /* _mulsi3 (a, b) int a, b; { return a * b; } */
- !
- ! long multl(a, b)
- ! long a, b;
- ! {
- ! int sign = 0;
- ! long umultl();
- ! if ((a ^ b) < 0) sign = 1;
- ! if (a < 0) a = -a;
- ! if (b < 0) b = -b;
- ! /*printf("a is %d b is %d\n", a, b);*/
- ! if (sign) return(- umultl(a,b));
- ! else return(umultl(a,b));
- ! }
- !
- #endif
- !
- ! #ifdef L_udivsi3
- ! /*_udivsi3 (a, b) unsigned a, b; { return a / b; } */
- !
- ! /*
- ! this routine based on one in the PD forth package for the sun by Mitch Bradley
- ! */
- !
- ! unsigned udivl(u, v)
- ! register unsigned long u, v;
- ! {
- ! register unsigned short um, ul, vm, vl;
- ! unsigned long ans;
- ! unsigned long u1, v1;
- ! long i;
- ! long rem;
- !
- ! if (v == 0) {
- ! /* should cause an exception condition */
- ! DIV(u, v);
- ! fprintf(stderr, "division by zero\n");
- ! }
- ! if (v > u) return(0);
- !
- ! ul = u; SWAP(u); um = u;
- ! vl = v; SWAP(v); vm = v;
- ! if (vm == 0) {
- ! u = vl; v = um;
- ! DIV(u, v);
- ! /* note -- if you delete the next line, gcc goes into
- ! an infinite loop */
- ! if (vm) printf("result is %d\n", v);
- ! vm = v & 0xFFFF; /* dividend is in low word */
- ! v &= 0xFFFF0000; /* remainder is in high word */
- ! v += ul;
- ! DIV(vl, v);
- ! v &= 0xFFFF; /* dividend is in low word */
- ! u = vm;
- ! SWAP(u);
- ! return(v + u);
- ! /*ans = ((um / vl) << 16) + ((((um % vl) << 16) + ul) / vl);
- ! return(ans);*/
- ! }
- !
- ! if (vl == 0) return(um / vm);
- ! SWAP(u); SWAP(v);
- ! if ( (u >> 3) < v) {
- ! for(i = 0; u >= v; i++, u -= v);
- ! /*printf("lt 8\n");*/
- ! return(i);
- ! }
- ! u1 = u; v1 = v;
- !
- ! /* scale divisor */
- ! v1--;
- ! for(i = 0; ((unsigned) v1) >= 0xFFFF; v1 >>= 1, i++);
- ! if (++v1 > 0xFFFF) {
- ! i++; v1 >>=1;
- ! }
- ! u1 >>= i;
- ! /*printf("i is %d, u1 is %x, v1 is %x\n", i, u1, v1);*/
- ! ans = u1 / v1;
- ! rem = u - (ans * v);
- ! if (rem > v) {ans++; rem -= v; }
- ! if (rem > v) {printf("oops\n");}
- ! return(ans);
- ! }
- ! #endif
- !
- ! #ifdef L_divsi3
- !
- ! long divl(a, b)
- ! long a, b;
- ! {
- ! int sign = 0;
- ! if ((a ^ b) < 0) sign = 1;
- ! if (a < 0) a = -a;
- ! if (b < 0) b = -b;
- ! if (sign) return(-udivl(a,b));
- ! else return(udivl(a,b));
- ! }
- ! #endif
- !
- ! #ifdef L_umodsi3
- ! #ifdef __GCC_OLD__
- ! _umodsi3 (a, b)
- ! #else
- ! __umodsi3 (a, b)
- ! #endif
- ! unsigned a, b;
- ! {
- ! /*return a % b;*/
- ! return (a - ((a/b)*b));
- ! }
- ! #endif
- !
- ! #ifdef L_modsi3
- ! #ifdef __GCC_OLD__
- ! _modsi3 (a, b)
- ! #else
- ! __modsi3 (a, b)
- ! #endif
- ! int a, b;
- ! {
- ! /*return a % b;*/
- ! return( a - ((a/b) * b));
- ! }
- ! #endif
- !
- ! #ifdef L_lshrsi3
- ! #ifdef __GCC_OLD__
- ! _lshrsi3 (a, b)
- ! #else
- ! __lshrsi3 (a, b)
- ! #endif
- ! unsigned a, b;
- ! {
- ! return a >> b;
- ! }
- ! #endif
- !
- ! #ifdef L_lshlsi3
- ! #ifdef __GCC_OLD__
- ! _lshlsi3 (a, b)
- ! #else
- ! __lshlsi3 (a, b)
- ! #endif
- ! unsigned a, b;
- ! {
- ! return a << b;
- ! }
- ! #endif
- !
- ! #ifdef L_ashrsi3
- ! #ifdef __GCC_OLD__
- ! _ashrsi3 (a, b)
- ! #else
- ! __ashrsi3 (a, b)
- ! #endif
- ! int a, b;
- ! {
- ! return a >> b;
- ! }
- ! #endif
- !
- ! #ifdef L_ashlsi3
- ! #ifdef __GCC_OLD__
- ! _ashlsi3 (a, b)
- ! #else
- ! __ashlsi3 (a, b)
- ! #endif
- ! int a, b;
- {
- ! return a << b;
- ! }
- ! #endif
- !
- !
- ! /* this divide stuff is hopelessly broken, in addition to being much
- ! more complicated than in needs to be. The new version's at the
- ! end of this file */
- !
- #if 0
- ! #ifdef L_divdf3
- !
- ! /*double _divdf3 (a, b) double a, b; { return a / b; } */
- !
- ! double drecip1(f1)
- ! double f1;
- ! {
- ! struct bitdouble *bdp = &f1;
- ! unsigned m1, m2;
- !
- ! printf("drecip1(%X)", f1);
- ! if (bdp->exp == 0 ) return(0L);
- ! if (bdp->mant1 == 0L) {
- ! bdp->exp = 0x3ff + 0x3ff - bdp->exp;
- ! bdp->mant2 = 0L;
- ! return(f1);
- ! }
- ! bdp->exp = 0x3ff + 0x3ff - bdp->exp - 1;
- ! m1 = (0x00100000 + bdp->mant1) >> 5;
- ! m2 = (0x80000000 / m1);
- ! /*printf("m1 %x m2 %x\n", m1, m2);*/
- ! m2 <<= 5;
- ! m2 &= 0xFFFFF;
- ! /*printf("exp %x mant %x\n", bdp->exp, m2);*/
- ! bdp->mant1 = m2;
- ! bdp->mant2 = 0L;
- ! printf("drecip1->%X\n", f1);
- ! return(f1);
- ! }
- !
- ! double drecip(f)
- ! double f;
- ! {
- ! struct bitdouble *bdp;
- ! double quotient, remainder;
-
- ! printf("drecip(%X)", f);
- ! quotient = drecip1(f);
- ! remainder = /* 1.0 */ ((double)one) - quotient * f;
- ! bdp = &remainder;
- ! for(; bdp->exp > 0x3ca; ) {
- ! printf("drc: exp=%X ", bdp->exp);
- ! remainder = /* 1.0 */ ((double)one) - (quotient*f);
- ! printf("rem=%X ", remainder);
- ! quotient = quotient + (drecip1(f)*remainder);
- ! }
- ! printf("drecip->%X\n", quotient);
- ! return(quotient);
- ! }
-
-
- ! double ddiv(f1, f2)
- ! double f1, f2;
- ! {
- ! return(f1 * drecip(f2));
- }
- #endif
- - #endif /* commented out divide routines */
-
- #ifdef L_muldf3
- /*double _muldf3 (a, b) double a, b; { return a * b; } */
-
- - #ifdef SLOW_KLUDGEY_QMULT
- - __qmult(m11, m12, m21, m22, p1, p2)
- - unsigned long m11, m12, m21, m22, *p1, *p2;
- - {
- - /* register unsigned long d2 = m11; */
- - register long d2 = m11;
- - register unsigned long d3 = m12, d4 = m21, d5 = m22, d6 =0, d7 = 0;
- - int i;
- - /* guess what happens if you delete the next line.... */
- - /* &i; */
- - for (i = 0; i < 11; i++) ASL2(d2, d3);
- - for (i = 0; i < 9; i++) ASL2(d4, d5);
- -
- - for (i = 0; i < 64; i++) {
- - if (d2 < 0) { ADD2(d4, d5, d6, d7);}
- - ASL2(d2, d3);
- - ASR2(d4, d5);
- - }
- - d2 = d6;
- - d3 = d7;
- - for (i = 0; i < 9; i++) ASR2(d2, d3);
- - *p1 = d2; *p2 = d3;
- - }
- -
- - #else
- - /* new qmult */
- -
- /* a set of totally local kludges, for summing partial results into
- result vector */
-
- ! /*
- ! #define XADDL(partial, target_ptr) \
- ! { register unsigned long temp = *target_ptr; \
- ! asm volatile("addl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
- ! *target_ptr-- = temp; temp = *target_ptr; \
- ! asm volatile("addxl #0,%0" : "=d" (temp) : "0" (temp)); \
- ! *target_ptr = temp; }
- ! */
- !
- ! static long constant_zero_kludge = 0;
- #define XXADDL(partial, target) \
- { register unsigned long * zero = &constant_zero_kludge + 1; \
- asm volatile("addl %3,%0@;\
- --- 83,222 ----
- #define dtol __fixdfsi
- #define ltod __floatsidf
- #endif
-
- ! #ifdef L_divdf3
-
- ! /* new double-float divide routine, by jrd */
- ! /* thanks jrd !! */
-
- ! #ifdef __GCC_OLD__
- ! double _divdf3(num, denom)
- ! #else
- ! double __divdf3(num, denom)
- #endif
- ! double num, denom;
- {
- ! double local_num = num;
- ! double local_denom = denom;
- ! struct bitdouble * num_bdp = (struct bitdouble *)(&local_num);
- ! struct bitdouble * den_bdp = (struct bitdouble *)(&local_denom);
- ! short num_exp = num_bdp->exp,
- ! den_exp = den_bdp->exp;
- ! short result_sign = 0;
- ! /* register */ unsigned long num_m1, num_m2, num_m3, num_m4;
- ! register unsigned long den_m1, den_m2, den_m3, den_m4;
- ! unsigned long result_mant[3];
- ! unsigned long result_mask;
- ! short result_idx;
- !
- ! if ((num_exp == 0) || (den_exp == 0)) /* zzz should really cause trap */
- ! return(0.0);
- !
- ! /* deal with signs */
- ! result_sign = result_sign + num_bdp->sign - den_bdp->sign;
- !
- ! /* unpack the numbers */
- ! num_m1 = num_bdp->mant1 | 0x00100000; /* hidden bit */
- ! num_m2 = num_bdp->mant2;
- ! num_m4 = num_m3 = 0;
- ! den_m1 = den_bdp->mant1 | 0x00100000; /* hidden bit */
- ! den_m2 = den_bdp->mant2;
- ! den_m4 = den_m3 = 0;
- !
- #if 0
- ! /* buy a little extra accuracy by shifting num and denum up 10 bits */
- ! for (result_idx /* loop counter */ = 0 ; result_idx < 10 ; result_idx++)
- ! {
- ! ASL3(num_m1, num_m2, num_m3);
- ! ASL3(den_m1, den_m2, den_m3);
- ! }
- ! #endif
-
- ! /* hot wire result mask and index */
- ! result_mask = 0x00100000; /* start at top mantissa bit */
- ! result_idx = 0; /* of first word */
- ! result_mant[0] = 0;
- ! result_mant[1] = 0;
- ! result_mant[2] = 0;
- !
- ! /* if denom is greater than num here, shift denom right one and dec num expt */
- ! if (den_m1 < num_m1)
- ! goto kludge1; /* C is assembly language,
- ! remember? */
- ! if (den_m1 > num_m1)
- ! goto kludge0;
- ! if (den_m2 <= num_m2) /* first word eq, try 2nd */
- ! goto kludge1;
- !
- ! kludge0:
- !
- ! num_exp--;
- ! ASR4(den_m1, den_m2, den_m3, den_m4);
- !
- ! kludge1:
- !
- ! for ( ; !((result_idx == 2) && (result_mask & 0x40000000)) ; )
- ! {
- ! /* if num >= den, subtract den from num and set bit in result */
- ! if (num_m1 > den_m1) goto kludge2;
- ! if (num_m1 < den_m1) goto kludge3;
- ! if (num_m2 > den_m2) goto kludge2;
- ! if (num_m2 < den_m2) goto kludge3;
- ! if (num_m3 > den_m3) goto kludge2;
- ! if (num_m3 < den_m3) goto kludge3;
- ! if (num_m4 < den_m4) goto kludge3;
- !
- ! kludge2:
- ! result_mant[result_idx] |= result_mask;
- ! SUB4(den_m1, den_m2, den_m3, den_m4, num_m1, num_m2, num_m3, num_m4);
- ! kludge3:
- ! ASR4(den_m1, den_m2, den_m3, den_m4);
- ! result_mask >>= 1;
- ! if (result_mask == 0) /* next word? */
- ! {
- ! result_mask = 0x80000000;
- ! result_idx++;
- ! }
- ! }
- !
- ! /* stick in last half-bit if necessary */
- ! if (result_mant[2])
- ! {
- ! den_m1 = 0; /* handy register */
- ! den_m2 = 1;
- ! /* busted
- ! ADD2(den_m1, den_m2, result_mant[0], result_mant[1]);
- ! */
- ! result_mant[1]++;
- ! if (result_mant[1] == 0)
- ! result_mant[0]++;
-
- + if (result_mant[0] & 0x00200000) /* overflow? */
- + {
- + num_exp--;
- + }
- + }
- + /* compute the resultant exponent */
- + num_exp = num_exp - den_exp + 0x3FF;
-
- ! /* reconstruct the result in local_num */
- ! num_bdp->sign = result_sign;
- ! num_bdp->exp = num_exp;
- ! num_bdp->mant1 = result_mant[0] & 0xFFFFF;
- ! num_bdp->mant2 = result_mant[1];
- !
- ! /* done! */
- ! return(local_num);
- }
- #endif
-
- #ifdef L_muldf3
- /*double _muldf3 (a, b) double a, b; { return a * b; } */
-
- /* a set of totally local kludges, for summing partial results into
- result vector */
-
- ! static unsigned long constant_zero_kludge = 0;
- #define XXADDL(partial, target) \
- { register unsigned long * zero = &constant_zero_kludge + 1; \
- asm volatile("addl %3,%0@;\
- ***************
- *** 425,452 ****
- : "0" (target), "g" (partial), "1" (zero)); \
- }
-
- - /*
- - #define ADDL(partial, target_ptr) \
- - { register unsigned long temp = *target_ptr; \
- - asm volatile("addl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
- - *target_ptr-- = temp }
- -
- - #define ADDXL(partial, target_ptr) \
- - { register unsigned long temp = *target_ptr; \
- - asm volatile("addxl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
- - *target_ptr-- = temp }
- -
- - #define ADDW(partial, target_ptr) \
- - { register unsigned short temp = *(unsigned short * )target_ptr; \
- - asm volatile("addw %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
- - *(unsigned short * )target_ptr-- = temp }
- -
- - #define ADDXW(partial, target_ptr) \
- - { register unsigned sort temp = *(unsigned short * )target_ptr; \
- - asm volatile("addxw %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
- - *(unsigned short * )target_ptr-- = temp }
- - */
- -
- static char component_index[] =
- {
- 3, 3, /* last ones */
- --- 225,230 ----
- ***************
- *** 526,533 ****
- *result_hi = res1;
- *result_lo = res2;
- }
- - #endif
- -
-
- double dmult(f1, f2)
- double f1, f2;
- --- 304,309 ----
- ***************
- *** 545,553 ****
- /* check for zero */
- if (! exp1) return(0.0);
- if (! exp2) return(0.0);
- ! d2 = 0x00100000 + bdp1->mant1;
- d3 = bdp1->mant2;
- ! d4 = 0x00100000 + bdp2->mant1;
- d5 = bdp2->mant2;
- __qmult(d2, d3, d4, d5, &p1, &p2);
- d6 = p1; d7 = p2;
- --- 321,329 ----
- /* check for zero */
- if (! exp1) return(0.0);
- if (! exp2) return(0.0);
- ! d2 = 0x00100000 | bdp1->mant1;
- d3 = bdp1->mant2;
- ! d4 = 0x00100000 | bdp2->mant1;
- d5 = bdp2->mant2;
- __qmult(d2, d3, d4, d5, &p1, &p2);
- d6 = p1; d7 = p2;
- ***************
- *** 605,614 ****
- howmuch = exp1 - exp2;
- if (howmuch > 53) return(f1);
-
- ! d7 = bdp2->mant1 + 0x00100000;
- d6 = bdp2->mant2;
-
- ! d5 = bdp1->mant1 + 0x00100000;
- d4 = bdp1->mant2;
-
- for (temp = 0; temp < howmuch; temp++) ASR2(d7, d6);
- --- 381,390 ----
- howmuch = exp1 - exp2;
- if (howmuch > 53) return(f1);
-
- ! d7 = bdp2->mant1 | 0x00100000;
- d6 = bdp2->mant2;
-
- ! d5 = bdp1->mant1 | 0x00100000;
- d4 = bdp1->mant2;
-
- for (temp = 0; temp < howmuch; temp++) ASR2(d7, d6);
- ***************
- *** 700,707 ****
- #ifdef L_fixunsdfsi
- /*_fixunsdfsi (a) double a; { return (unsigned int) a; } */
-
- - /* #ifdef L_fixdfsi _fixdfsi (a) double a; { return (int) a; } #endif */
- -
- unsigned long dtoul(f)
- double f;
- {
- --- 476,481 ----
- ***************
- *** 710,716 ****
- bdp = (struct bitdouble *)&f;
- si = bdp->sign;
- ex = bdp->exp;
- ! mant1 = bdp->mant1 + 0x00100000;
- mant2 = bdp->mant2;
-
- /* zero value */
- --- 484,490 ----
- bdp = (struct bitdouble *)&f;
- si = bdp->sign;
- ex = bdp->exp;
- ! mant1 = bdp->mant1 | 0x00100000;
- mant2 = bdp->mant2;
-
- /* zero value */
- ***************
- *** 744,750 ****
- u.i[LOW] = (unsigned int) a; u.i[HIGH] = 0; return u.d; } */
- #endif
-
- -
- #ifdef L_fixdfdi
- double
- #ifdef __GCC_OLD__
- --- 518,523 ----
- ***************
- *** 808,878 ****
- }
- #endif
-
- - #ifdef L_addsf3
- - SFVALUE
- - _addsf3 (a, b)
- - union flt_or_int a, b;
- - {
- - union flt_or_int intify; return INTIFY ((double) a.f + (double) b.f);
- - }
- - #endif
- -
- - #ifdef L_negsf2
- - SFVALUE
- - _negsf2 (a)
- - union flt_or_int a;
- - {
- - union flt_or_int intify;
- - return INTIFY (-((double) a.f));
- - }
- - #endif
- -
- - #ifdef L_subsf3
- - SFVALUE
- - _subsf3 (a, b)
- - union flt_or_int a, b;
- - {
- - union flt_or_int intify;
- - return INTIFY (((double) a.f - (double) b.f));
- - }
- - #endif
- -
- - #ifdef L_cmpsf2
- - SFVALUE
- - _cmpsf2 (a, b)
- - union flt_or_int a, b;
- - {
- - union flt_or_int intify;
- - double a1, b1;
- - a1 = a.f; b1 = b.f;
- - if ( a1 > b1)
- - return 1;
- - else if (a1 < b1)
- - return -1;
- - return 0;
- - }
- - #endif
- -
- - #ifdef L_mulsf3
- - SFVALUE
- - _mulsf3 (a, b)
- - union flt_or_int a, b;
- - {
- - union flt_or_int intify;
- - return INTIFY (((double) a.f * (double) b.f));
- - }
- - #endif
- -
- - #ifdef L_divsf3
- - SFVALUE
- - _divsf3 (a, b)
- - union flt_or_int a, b;
- - {
- - union flt_or_int intify;
- - return INTIFY (((double) a.f / (double) b.f));
- - }
- - #endif
- -
- #ifdef L_truncdfsf2
- float __dtof(d)
- double d;
- --- 581,586 ----
- ***************
- *** 933,1063 ****
- union flt_or_int intify;
- double retval;
- return (__ftod(a));
- - }
- - #endif
- -
- - #ifdef L_divdf3
- -
- - /* new double-float divide routine, by jrd */
- - /* thanks jrd !! */
- -
- - #ifdef __GCC_OLD__
- - double _divdf3(num, denom)
- - #else
- - double __divdf3(num, denom)
- - #endif
- - double num, denom;
- - {
- - double local_num = num;
- - double local_denom = denom;
- - struct bitdouble * num_bdp = (struct bitdouble *)(&local_num);
- - struct bitdouble * den_bdp = (struct bitdouble *)(&local_denom);
- - short num_exp = num_bdp->exp,
- - den_exp = den_bdp->exp;
- - short result_sign = 0;
- - /* register */ unsigned long num_m1, num_m2, num_m3, num_m4;
- - register unsigned long den_m1, den_m2, den_m3, den_m4;
- - unsigned long result_mant[3];
- - unsigned long result_mask;
- - short result_idx;
- -
- - if ((num_exp == 0) || (den_exp == 0)) /* zzz should really cause trap */
- - return(0.0);
- -
- - /* deal with signs */
- - result_sign = result_sign + num_bdp->sign - den_bdp->sign;
- -
- - /* unpack the numbers */
- - num_m1 = num_bdp->mant1 | 0x00100000; /* hidden bit */
- - num_m2 = num_bdp->mant2;
- - num_m4 = num_m3 = 0;
- - den_m1 = den_bdp->mant1 | 0x00100000; /* hidden bit */
- - den_m2 = den_bdp->mant2;
- - den_m4 = den_m3 = 0;
- -
- - #if 0
- - /* buy a little extra accuracy by shifting num and denum up 10 bits */
- - for (result_idx /* loop counter */ = 0 ; result_idx < 10 ; result_idx++)
- - {
- - ASL3(num_m1, num_m2, num_m3);
- - ASL3(den_m1, den_m2, den_m3);
- - }
- - #endif
- -
- - /* hot wire result mask and index */
- - result_mask = 0x00100000; /* start at top mantissa bit */
- - result_idx = 0; /* of first word */
- - result_mant[0] = 0;
- - result_mant[1] = 0;
- - result_mant[2] = 0;
- -
- - /* if denom is greater than num here, shift denom right one and dec num expt */
- - if (den_m1 < num_m1)
- - goto kludge1; /* C is assembly language,
- - remember? */
- - if (den_m1 > num_m1)
- - goto kludge0;
- - if (den_m2 <= num_m2) /* first word eq, try 2nd */
- - goto kludge1;
- -
- - kludge0:
- -
- - num_exp--;
- - ASR4(den_m1, den_m2, den_m3, den_m4);
- -
- - kludge1:
- -
- - for ( ; !((result_idx == 2) && (result_mask & 0x40000000)) ; )
- - {
- - /* if num >= den, subtract den from num and set bit in result */
- - if (num_m1 > den_m1) goto kludge2;
- - if (num_m1 < den_m1) goto kludge3;
- - if (num_m2 > den_m2) goto kludge2;
- - if (num_m2 < den_m2) goto kludge3;
- - if (num_m3 > den_m3) goto kludge2;
- - if (num_m3 < den_m3) goto kludge3;
- - if (num_m4 < den_m4) goto kludge3;
- -
- - kludge2:
- - result_mant[result_idx] |= result_mask;
- - SUB4(den_m1, den_m2, den_m3, den_m4, num_m1, num_m2, num_m3, num_m4);
- - kludge3:
- - ASR4(den_m1, den_m2, den_m3, den_m4);
- - result_mask >>= 1;
- - if (result_mask == 0) /* next word? */
- - {
- - result_mask = 0x80000000;
- - result_idx++;
- - }
- - }
- -
- - /* stick in last half-bit if necessary */
- - if (result_mant[2])
- - {
- - den_m1 = 0; /* handy register */
- - den_m2 = 1;
- - /* busted
- - ADD2(den_m1, den_m2, result_mant[0], result_mant[1]);
- - */
- - result_mant[1]++;
- - if (result_mant[1] == 0)
- - result_mant[0]++;
- -
- - if (result_mant[0] & 0x00200000) /* overflow? */
- - {
- - num_exp--;
- - }
- - }
- - /* compute the resultant exponent */
- - num_exp = num_exp - den_exp + 0x3FF;
- -
- - /* reconstruct the result in local_num */
- - num_bdp->sign = result_sign;
- - num_bdp->exp = num_exp;
- - num_bdp->mant1 = result_mant[0] & 0xFFFFF;
- - num_bdp->mant2 = result_mant[1];
- -
- - /* done! */
- - return(local_num);
- }
- #endif
- --- 641,645 ----
- *** /tmp/,RCSt1a22974 Thu Aug 31 21:02:29 1989
- --- vfprintf.c Thu Aug 31 20:57:09 1989
- ***************
- *** 44,49 ****
- --- 44,51 ----
- _ulong = flags&LONGINT ? va_arg(argp, long) : \
- flags&SHORTINT ? va_arg(argp, short) : va_arg(argp, int);
-
- + #define TEN_MUL(X) ((((X) << 2) + (X)) << 1)
- +
- #define todigit(c) ((c) - '0')
- #define tochar(n) ((n) + '0')
-
- ***************
- *** 146,152 ****
- else {
- n = 0;
- while (isascii(*fmt) && isdigit(*fmt))
- ! n = 10 * n + todigit(*fmt++);
- --fmt;
- }
- prec = n < 0 ? -1 : n;
- --- 148,154 ----
- else {
- n = 0;
- while (isascii(*fmt) && isdigit(*fmt))
- ! n = TEN_MUL(n) + todigit(*fmt++);
- --fmt;
- }
- prec = n < 0 ? -1 : n;
- ***************
- *** 163,169 ****
- case '5': case '6': case '7': case '8': case '9':
- n = 0;
- do {
- ! n = 10 * n + todigit(*fmt);
- } while (isascii(*++fmt) && isdigit(*fmt));
- width = n;
- --fmt;
- --- 165,171 ----
- case '5': case '6': case '7': case '8': case '9':
- n = 0;
- do {
- ! n = TEN_MUL(n) + todigit(*fmt);
- } while (isascii(*++fmt) && isdigit(*fmt));
- width = n;
- --fmt;
-